//给你两个字符串：ransomNote 和 magazine ，判断 ransomNote 能不能由 magazine 里面的字符构成。
//
// 如果可以，返回 true ；否则返回 false 。
//
// magazine 中的每个字符只能在 ransomNote 中使用一次。
//
//
//
// 示例 1：
//
//
//输入：ransomNote = "a", magazine = "b"
//输出：false
//
//
// 示例 2：
//
//
//输入：ransomNote = "aa", magazine = "ab"
//输出：false
//
//
// 示例 3：
//
//
//输入：ransomNote = "aa", magazine = "aab"
//输出：true
//
//
//
//
// 提示：
//
//
// 1 <= ransomNote.length, magazine.length <= 10⁵
// ransomNote 和 magazine 由小写英文字母组成
//
//
// Related Topics 哈希表 字符串 计数 👍 707 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function canConstruct(ransomNote: string, magazine: string): boolean {
// 可以简化为数组而不是map 因为字母都是小写
    let map : Map<string,number> = new Map<string, number>()
    for (let i = 0; i < ransomNote.length; i++) {
        map.get(ransomNote.charAt(i)) ? map.set(ransomNote.charAt(i), map.get(ransomNote.charAt(i)) + 1): map.set(ransomNote.charAt(i), 1)
    }
    for (let j = 0; j < magazine.length; j++) {
        if (map.get(magazine.charAt(j))) {
            map.set(magazine.charAt(j),map.get(magazine.charAt(j)) - 1)
        }
    }
    for (let i = 0; i < Array.from(map.values()).length; i ++) {
        if (Array.from(map.values())[i] !== 0) return false
    }
    return true
};
//leetcode submit region end(Prohibit modification and deletion)
// 这个思想是用ascii吗来消 相同的就销成了0
function canConstruct2(ransomNote: string, magazine: string): boolean {
    let helperArr: number[] = new Array(26).fill(0);
    let base: number = 'a'.charCodeAt(0);
    let index: number;
    for (let i = 0, length = magazine.length; i < length; i++) {
        helperArr[magazine[i].charCodeAt(0) - base]++;
    }
    for (let i = 0, length = ransomNote.length; i < length; i++) {
        index = ransomNote[i].charCodeAt(0) - base;
        helperArr[index]--;
        if (helperArr[index] < 0) {
            return false;
        }
    }
    return true;
};
